Term-by-term delta between the as-delivered model (https://chubb.com/ontology/ins#) and the proposed refactor (https://data.chubb.com/ontology/ins/…). Every row cites the backlog story that carries it; the "After" column is implemented on branch refactor/claim-structural-fixes in the accompanying repo — review the ontology, not just this table.
Change types: SPLIT one term becomes several · NEW no counterpart before · RE-HOMED moved to the class it describes · RE-PLATFORMED schema enum → SKOS scheme · CORRECTED defective declaration fixed in place · RETIRED deprecated with no successor (derivable/redundant)
| Before (as delivered) | After (proposed) | Change | Story | Why |
|---|---|---|---|---|
| ins:Claim ⊑ gist:Event — demand, loss, lifecycle, ledger and party register in one class | claim:Claim ⊑ core:Case (the demand only) · owl:disjointWith claim:Loss | SPLIT | CLM-1 | ACORD Claim ≠ ClaimsOccurrence; OMG P&C; project claim CQ model |
| — (no loss class exists) | claim:Loss ⊑ core:Event — lossDate, lossDescription, lossLocation, causedByPeril | NEW | CLM-1/2 | Loss facts stated once; N claims per loss |
| — (cat is a mandatory string code on every claim) | claim:CatastropheEvent ⊑ core:Event — catEventCode [1..1] | NEW | CLM-3 | Cat aggregation by IRI, not string join |
| — (lifecycle = 3 date literals) | claim:ClaimEvent ⊑ core:Event + FnolEvent / OpeningEvent / ClosingEvent / ReopeningEvent (pairwise disjoint, OWL-Time + PROV-O) | NEW | CLM-4 | Reopen history, cycle times, audit trail (CQ-C10/C11) |
| ins:ClaimStatus ⊑ gist:Category — 8 display-string individuals incl. "In Subrogation" | cstat: skos:ConceptScheme (/vocabulary/ins/claim-status/) — 7 concepts with notation + ACORD *Match; "In Subrogation" retired | RE-PLATFORMED | CLM-5 | Code lists are reference data (project codelist-SKOS standard) |
| ins:ClaimType ⊑ gist:Category — 5 values incl. "Subrogation" | ctype: skos:ConceptScheme — 4 concepts; "Subrogation" retired (it is a process) | RE-PLATFORMED | CLM-6 | One code-list pattern; type stats become meaningful |
| ins:PaymentType ⊑ gist:Category — zero values defined | cpay: skos:ConceptScheme — Indemnity, Expense-ALAE, Expense-ULAE, Defense, RecoveryOffset | RE-PLATFORMED | CLM-11 | Empty class → populated governed list |
| — (amounts are undated bare decimals) | claim:FinancialSummary — valuationDate [1..1] + four MoneyAmount links | NEW | CLM-8 | Loss development reconstructible |
| — (money = xsd:decimal) | core:MoneyAmount — hasAmount [1..1] + hasCurrency [1..1] → ISO-4217 concept; closeMatch FIBO & schema.org MonetaryAmount | NEW | CLM-7 | A bare decimal is not money |
| ins:Subrogation ⊑ gist:Event — empty class, 0 properties (plus a type value and a status value) | claim:SubrogationProcess — subrogationOn [1..1], againstParty, recoveredAmount, outcome | SPLIT | CLM-12 | One construct instead of three (taxonomy trap) |
| ins:ReinsuranceClaim ⊑ gist:Event — originatingClaim optional | claim:ReinsuranceClaim ⊑ claim:Claim — originatingClaim [1..1], agreement [1..1] | CORRECTED | CLM-13 | It is a demand by the cedent — a Claim, anchored to its source |
| ins:LossHistory — policy/claim/claimant/insurer/status all as strings | claim:LossHistory (evidence record) — optional IRI links aboutClaim / underReportedPolicy / claimant role; literals kept as dct:source evidence; status from cstat: | CORRECTED | CLM-14 | Message-encoding antipattern; loss runs join the graph |
| ins:PartyRole — contextId string + RoleContext enum + roleCode string | party:PartyRole — roleIn [1..1] (the context IRI), hasRoleType [1..1] (role scheme), isPlayedBy [1..1] | CORRECTED | CLM-10 / roles | Context by IRI; kind as governed concept — see worked example |
| ins:Party ⊑ gist:Category | party:Party (properly typed — a party is a thing, not a classification) | CORRECTED | roles | Upper-alignment error |
| ins:Underwriter ⊑ ins:PartyRole (+ 9 sibling role classes, typed twice via roleCode) | party:UnderwriterRole (kept — carries authority level) + role:Underwriter skos:Concept; non-structure-bearing roles become concepts only | SPLIT | roles | §2.4 test: class if it has structure, value if it doesn't |
| ins:CoveredPeril, ins:InsuranceCoverage — bare owl:Class roots | peril: skos:ConceptScheme; policy:InsuranceCoverage anchored under the agreement branch | RE-PLATFORMED | POL-5 | 62 untyped roots; perils are code-like values |
| Before | After | Change | Story | Why |
|---|---|---|---|---|
| ins:claimOnPolicy (Claim→Policy, optional) + ins:hasClaim (Policy→Claim, hand-mirrored, no owl:inverseOf) | claim:underPolicy [1..1 SHACL] · single owl:inverseOf policy:hasClaim | CORRECTED | CLM-9/15 | No orphan claims; inverses can't drift |
| ins:hasClaimOnCoverage (Claim→Claim!) — doc describes coverage→claim | removed → claim:respondingCoverage (Claim→Coverage) · inverseOf policy:hasRespondingClaim | CORRECTED | CLM-9 | Copy-paste domain error |
| ins:claimLocation (Claim→Location) | claim:lossLocation (Loss→core:Place) | RE-HOMED | CLM-2 | The loss happened somewhere, not the paperwork |
| ins:claimPeril (Claim→CoveredPeril) | claim:causedByPeril (Loss→peril concept) | RE-HOMED | CLM-2 | + range becomes a governed concept |
| ins:claimantParty (Claim→Party) | claim:claimant (Claim→claim:Claimant ⊑ party:PartyRole) | CORRECTED | CLM-10 | Role reification; third-party claimants expressible with history |
| ins:hasAdjuster (Claim→Party) | claim:hasAdjusterAssignment (→ AdjusterAssignment role with validity) | CORRECTED | CLM-10 | Reassignment preserves history |
| ins:hasClaimStatus (→ ClaimStatus individual, 0..1) | claim:hasClaimStatus (→ skos:Concept, [1..1], sh:in scheme; derived from event tail) | RE-PLATFORMED | CLM-5 | Status = view of latest lifecycle event |
| ins:hasClaimType (→ ClaimType individual) | claim:hasClaimType (→ ctype concept, [0..1], sh:in) | RE-PLATFORMED | CLM-6 | — |
| ins:paymentOnClaim (optional) / ins:hasClaimPayment (mirrored) | claim:paymentOnClaim [1..1] · owl:inverseOf claim:hasClaimPayment | CORRECTED | CLM-11 | No orphan payments |
| ins:paymentType (→ empty PaymentType class) | claim:paymentType (→ cpay concept, [1..1], sh:in) | RE-PLATFORMED | CLM-11 | Indemnity/expense splits reconcile |
| ins:hasSubrogation (→ empty class) | claim:subrogationOn [1..1] · inverseOf claim:hasSubrogation | CORRECTED | CLM-12 | Canonical direction from the process |
| ins:originatingClaim (optional) | claim:originatingClaim [1..1 SHACL] | CORRECTED | CLM-13 | Gross-to-net never hits an unanchored recovery |
| — | NEW: claim:hasLoss [1..1] (+inv), partOfCatastrophe [0..1], hasClaimEvent [1..*], hasFinancialSummary [0..*], hasPaidTotal / hasOutstandingReserve / hasRecoveryTotal / hasExpensePaid, recoveredAmount, payee | NEW | CLM-1..12 | The split model's connective tissue |
| ins:isRoleOf (role→Party) + ins:hasPartyRole (mirrored, no inverseOf) | party:isPlayedBy [1..1] · single owl:inverseOf party:hasPartyRole | CORRECTED | roles | — |
| ins:roleContext (→ POLICY_TERM/CLAIM/GLOBAL enum) + ins:contextId (string!) | party:roleIn [1..1] — the Policy/Claim/Quote IRI itself · inverseOf party:hasRole | CORRECTED | roles | String join → graph edge; enum redundant with target's type |
| ins:hasPolicyUnderwriter, ins:hasBackupUnderwriter (Policy→Underwriter, parallel to the role channel) | deprecated → traversal: ?role party:roleIn ?policy ; hasRoleType role:Underwriter ; rolePriority 1|2 | RETIRED | roles | One channel, one truth — see worked example |
| ins:resultsInPolicy declared Policy→Policy ("Quote that produced this policy when bound") | resultsInPolicy: Quote→Policy · owl:inverseOf originatedFromQuote | CORRECTED | POL-1 | Declared domain contradicts its own definition |
| Before | After | Change | Story | Why |
|---|---|---|---|---|
| ins:claimNumber — mandatory flag, no uniqueness, no identifier semantics | claim:claimId ⊑ dct:identifier — [1..1] + pattern + graph-wide uniqueness (SHACL-SPARQL) | CORRECTED | CLM-15 | FunctionalProperty would MERGE duplicates; shapes report them |
| ins:dateReported / dateOpened / dateClosed | retired → timestamps on FnolEvent / OpeningEvent / ClosingEvent (derived views during migration) | RETIRED | CLM-4 | Three literals can't hold a reopen history |
| ins:paidAmount / reserveAmount / recoveryAmount / claimExpenseAmount : xsd:decimal | object links to core:MoneyAmount inside a valuation-dated FinancialSummary | RE-PLATFORMED | CLM-7/8 | Currency + as-of date restored |
| ins:incurredAmount ("paid plus outstanding reserves") | retired — computed; SHACL-SPARQL consistency check for feeds that ship it | RETIRED | CLM-8 | Never store a derivation |
| ins:catastropheEventCode — MANDATORY on every claim | claim:catEventCode — [1..1] on CatastropheEvent only | RE-HOMED | CLM-3 | Non-cat claims carry nothing |
| ins:isCatastropheRelated : xsd:boolean | retired — derivable from partOfCatastrophe link presence | RETIRED | CLM-3 | — |
| ins:paymentAmount : xsd:decimal | claim:paymentAmount → core:MoneyAmount [1..1] | RE-PLATFORMED | CLM-11 | — |
| LossHistory: lossClaimNumber / lossPolicyNumber / claimantName / lossInsurer / claimStatus — strings | IRI links (aboutClaim, underReportedPolicy, claimant role, insurer party) when resolved; literals kept as dct:source evidence; status → cstat concept | CORRECTED | CLM-14 | Five graph edges recovered from literals |
| ins:roleCode / roleCodeDescription — free strings per record | party:hasRoleType → role concept; the code lives ONCE as skos:notation on the concept | RE-PLATFORMED | roles | New file: vocabulary/ins/party-role/role-scheme.jsonld |
| ins:policyType, ins:policyLanguage + policyLanguageCode | policy-type scheme; hasPolicyLanguage → ISO-639 concept (label + code = prefLabel + notation) | RE-PLATFORMED | POL-4 | Same fact stored twice, uncoordinated |
| ins:policyCancellationDate / cancellationDescription / cancellationTypeCode / cancellationNoticeDays | policy:CancellationEvent (+ ReinstatementEvent) with OWL-Time + typed reason | SPLIT | POL-3 | Cancel→reinstate→cancel history representable |
| owl:FunctionalProperty stamps on ~30 single-valued properties | removed → SHACL sh:maxCount 1 with named messages | CORRECTED | CLM-15 | Shapes count, axioms classify |
| Before | After | Change | Story | Why |
|---|---|---|---|---|
| https://chubb.com/ontology/ins#Claim — wrong host, hash IRI, one flat namespace for 170 classes | https://data.chubb.com/ontology/ins/claim/ (schema) · /vocabulary/ins/…/ (SKOS) · /resource/… (instances) · versionIRI per NS-5/6/8 | CORRECTED | CLM-16 | Namespace policy NS-1..NS-8; bridge/legacy-claim-bridge.ttl maps every migrated term |